#include <bits/stdc++.h>
using ll =long long;
using namespace std;
// int main()
// {
//     int n;
//     cin>>n;
//     vector<int> ret(n);
//     for(int i=0;i<n;i++)ret[i]=i+1;
//     for(int i=1;i<n;i++)
//     {
//         int left=i-1,mid=i,right=mid+1;
//         if(mid<n-1)
//         if(ret[left]>ret[mid]&&ret[right]<ret[mid]||ret[left]<ret[mid]&&ret[right]>ret[mid])
//             swap(ret[right],ret[mid]);
//     }
//     for(auto& x:ret)cout<<x<<" ";
//     cout<<endl;
//     return 0;
// }
// int n,m;
// int main()
// {
//     cin>>n>>m;
//     int a,b;
//     set<int> s;
//     for(int i=0;i<n;i++)
//     {
//         cin>>a;
//         s.insert(a);
//     }
//     for(int i=0;i<m;i++)
//     {
//         cin>>b;
//         s.insert(b);
//     }
//     int count=0;
//     for(auto it=s.begin();it!=s.end();it++,count++)
//     {
//         //std::distance(it, mySet.end()) > 1不使用count来检测是否到了倒数第二个位置
//         if(count!=s.size()-1)
//             cout<<*it<<" ";
//         else cout<<*it;
//     }
//     cout<<endl;
//     return 0;
// }

//区间dp
int main()
{
    string s;
    cin>>s;
    vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
    for(int i=0;i<s.size();i++)dp[i][i]=1;
    for(int i=s.size()-1;i>=0;i--)
    {
        //从i+1开始是为了确保i<j成立，一直有解，i==j的情况外面赋值了
        //i>j的时候是无解的
        for(int j=i+1;j<s.size();j++)
        {
            if(s[i]==s[j])
            {
                dp[i][j]=dp[i+1][j-1]+2;
            }
            else dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
        }
    }
    cout<<dp[0][s.size()-1]<<endl;
    return 0;
}